package br.com.virtual.vender.dao.impl;

import java.util.ArrayList;
import java.util.List;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.base.enums.StatusVendaEnum;
import br.com.virtual.cadastrar.model.Pessoa;
import br.com.virtual.vender.dao.VendaDAO;
import br.com.virtual.vender.model.ItemVenda;
import br.com.virtual.vender.model.Venda;

public class VendaDAOImpl extends BaseDaoImpl implements VendaDAO {

	@Override
	public Venda create(Venda venda) {

		getManager().persist(venda);
		return venda;
	}

	@Override
	public Venda read(Long id) {
		return getManager().find(Venda.class, id);
	}

	@Override
	public void update(Venda venda) {
		getManager().merge(venda);
	}

	@Override
	public void delete(Venda venda) {
		getManager().remove(read(venda.getId()));
	}

	@Override
	public List<Venda> getList() {
		return this.list("");
	}

	@Override
	public List<Venda> getListByPessoa(Pessoa pessoa) {
		List<Venda> venda = new ArrayList<Venda>(this
				.getManager()
				.createQuery(
						" select distinct v from Venda v "
								+ "inner join fetch v.itens i "
								+ "where v.cliente = :pessoa "
								+ "order by v.dataVenda desc ", Venda.class)
				.setParameter("pessoa", pessoa).getResultList());

		return venda;
	}

	private List<Venda> list(String where) {
		return new ArrayList<Venda>(getManager().createQuery(
				"from Venda c " + where, Venda.class).getResultList());
	}

	@Override
	public List<Venda> getListEmAndamento() {

		List<Venda> lista = new ArrayList<Venda>(getManager()
				.createQuery("from Venda c where c.status != :status ",
						Venda.class)
				.setParameter("status", StatusVendaEnum.ENTREGE).getResultList());

		return lista;
	}

	@Override
	public List<Venda> getListByPessoaEmAndamento(Pessoa pessoa) {
		List<Venda> lista = new ArrayList<Venda>(
				getManager()
						.createQuery(
								"from Venda c where c.cliente = :pessoa and c.status != :status ",
								Venda.class).setParameter("pessoa", pessoa)
						.setParameter("status", StatusVendaEnum.ENTREGE)
						.getResultList());

		return lista;
	}

	@Override
	public List<ItemVenda> getItens(Venda venda) {

		List<ItemVenda> iv = getManager()
				.createQuery(
						" select iv from ItemVenda iv where iv.venda = :venda",
						ItemVenda.class).setParameter("venda", venda)
				.getResultList();

		return new ArrayList<ItemVenda>(iv);
	}

}
